/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package vue;

import controleur.ControllerCreationCarte;
import controleur.ControllerParametrageSimulation;
import controleur.ControllerSimulation;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.Hashtable;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.border.EmptyBorder;
import metier.Carte;
import metier.Environnement;
import utiles.K;
import utiles.TypeFrequence;

/**
 *
 * @author GS
 */
public class VueParametrageSimulation extends FourmizFrame implements WindowListener, ActionListener{
    
    protected FourmizJButton btn_suivant, btn_ouvrir, btn_nouveau, btn_editer, btn_supprimer;
    protected JSlider input_duree_vie_fourmis, input_quantite_naissance, input_concentration, input_frequence_naissance, input_vitesse_concentration;  
    protected JComboBox ld_cartes, type_frequence_naissance;
    protected ControllerParametrageSimulation c;
    protected ControllerCreationCarte ccc;
    protected ControllerSimulation cs;
    protected Environnement e;
    protected ArrayList<Carte> cartes;
    
    /**
     * Constructeur de la vue de paramétrage
     * @param c 
     * @param e 
     */
    public VueParametrageSimulation(ControllerParametrageSimulation c, Environnement e)
    {
        super("Paramétrage de la simulation");
        
        this.c      = c;
        this.ccc    = new ControllerCreationCarte(this); 
        this.e      = e;
        
        this.initDimensions(); //On determine les dimensions de la fenêtre
        this.initComponents(); //On initialise les composants graphiques
        this.initDataComponents(); //On initialise les données par défaut des composants
        this.initLayouts(); //On initialise les différents layouts de la fenêtre
        this.initListeners(); 
        this.majStateComponents(); // On determine l'état enable / disable des composants
        
        this.pack();
        this.centrerFenetre();
    }
    
    /**
     * Retourne la carte selectionnée/active dans la liste déroulante
     * @return une instance de Carte, null si aucune carte n'est selectionnée
     */
    protected Carte getCurrentCarte()
    {
        int index = this.ld_cartes.getSelectedIndex();
        if(index > 0 && index <= this.cartes.size())
        {
            return this.cartes.get(index-1);
        }        
        return null;
    }
    
    protected void majStateComponents()
    {
        int index_combo = this.ld_cartes.getSelectedIndex();
        boolean rupture = index_combo > 0;
        
        this.btn_suivant.setEnabled(rupture);
        
        //rupture = false;
        this.btn_editer.setEnabled(rupture);
        this.btn_supprimer.setEnabled(rupture);       
        this.btn_ouvrir.setEnabled(true);        
        
        //V2 -> pas toutes les fonctionnalités activées
        this.input_concentration.setEnabled(rupture);
        this.input_duree_vie_fourmis.setEnabled(rupture);
        this.input_frequence_naissance.setEnabled(rupture);
        this.input_quantite_naissance.setEnabled(rupture);
        this.input_vitesse_concentration.setEnabled(rupture);
        this.type_frequence_naissance.setEnabled(rupture);
    }
    
    /**
     * Initialise tous les composants swing de la fenêtre
     */
    private void initComponents()
    {
        //Initialisation des boutons
        this.btn_suivant = new FourmizJButton('\uf18e'); //arrow-circle-o-right
        this.btn_suivant.setToolTipText("Suivant");
        this.btn_suivant.agrandir(50);
        
        this.btn_nouveau = new FourmizJButton('\uf067'); //plus
        this.btn_nouveau.setToolTipText("Créer une nouvelle carte");
        this.btn_nouveau.reduire(25);
        this.btn_nouveau.setForeground(K.GREEN);
        
        
        this.btn_ouvrir = new FourmizJButton('\uf115');//folder-open-o
        this.btn_ouvrir.setToolTipText("Importer une carte");
        this.btn_ouvrir.reduire(50);   
        
        
        this.btn_editer = new FourmizJButton('\uf040'); //pencil
        this.btn_editer.reduire(50);
        this.btn_editer.setToolTipText("Modifier la carte selectionnée");
        this.btn_editer.setForeground(K.BLUE);
        
        this.btn_supprimer = new FourmizJButton('\uf014');//trash-o
        this.btn_supprimer.reduire(50);
        this.btn_supprimer.setToolTipText("Supprimer la carte selectionnée");
        this.btn_supprimer.setForeground(Color.RED);

        
        //Initialisation des input
        this.input_duree_vie_fourmis            = this.createSlider(K.DUREES_VIE_FOURMIS, e.getDureeVieFourmis() / K.COEFF_DUREE_VIE_FOURMIS);
        this.input_frequence_naissance          = this.createSlider(K.FREQUENCES_NOUVELLES_NAISSANCES_FOURMIS, e.getFrequenceNaissanceInt());
        this.input_quantite_naissance           = this.createSlider(K.QUANTITES_NAISSANCE_FOURMIS, e.getQuantiteNaissance() / K.COEFF_QUANTITES_NAISSANCE_FOURMIS);
        this.input_vitesse_concentration        = this.createSlider(K.VITESSES_EVAPORATIONS_PHEROMONES, e.getEvaporation());
        this.input_concentration                = this.createSlider(K.CONCENTRATIONS_PHEROMONES, e.getConcentration());
        
        //Initialisation de la liste des cartes
        this.ld_cartes = new JComboBox();
        this.ld_cartes.setPreferredSize(new Dimension(100, 30));
        
        this.type_frequence_naissance = new JComboBox();
        //this.type_frequence_naissance.setPreferredSize(new Dimension(200, 30)); //useless
    }
    
    /**
     * Initialise les valeurs par défaut des composants swing
     */
    private void initDataComponents() {
        
        TypeFrequence types[] = TypeFrequence.values();
        
        int i = 0, index = 0;
        
        for (TypeFrequence type : types) {
            this.type_frequence_naissance.addItem(type);
            if(type.equals(this.e.getTypeFrequenceNaissance()))
            {
                index = i;
            }
            i++;
        }        
        this.type_frequence_naissance.setSelectedIndex(index);
        
        this.initDataCartes();
    }
    
    protected JSlider createSlider(String[] steps, int defaultValue)
    {        
        //Create the slider
        
    	JSlider slider = new JSlider(JSlider.HORIZONTAL, 1, steps.length , defaultValue);
        //framesPerSecond.addChangeListener(this);
        slider.setMajorTickSpacing(1);
        slider.setPaintTicks(true);

        //Create the label table
        Hashtable labelTable = new Hashtable();
        
        for(int i = 0; i < steps.length; i++)
        {
            labelTable.put(i+1, new JLabel(steps[i]));
        }
        
        slider.setLabelTable(labelTable);
        slider.setPaintLabels(true);
        
        return slider;
    }
    
    /**
     * Initialise les valeurs par défauts de la liste déroulante des cartes
     */
    private void initDataCartes()
    {
        this.cartes = this.c.getSavedCartes();
        this.ld_cartes.addItem("Selectionner...");
        for(Carte carte: this.cartes)
        {
            this.ld_cartes.addItem(carte.getNom());
        }
    }
    
    /**
     * Initialise les dimensions de la fenêtre
     */
    private void initDimensions()
    {
        int hauteur = 500;
        int largeur = 1000;
        
        this.setSize(largeur, hauteur);
        this.setPreferredSize(new Dimension(largeur,hauteur));
    }
    
    /**
     * Initialise les listeners de la fenêtre
     */
    private void initListeners()
    {
        this.addWindowListener(this);
        
        this.btn_suivant.addActionListener(this);
        this.btn_nouveau.addActionListener(this);
        this.btn_editer.addActionListener(this);
        this.btn_supprimer.addActionListener(this);
        this.btn_ouvrir.addActionListener(this);
        
        this.ld_cartes.addActionListener(this);
    }
    
    /**
     * Initialise le layout par défaut de la fenêtre ainsi que les layouts enfants
     */
    private void initLayouts()
    {
        JPanel mainLayout = new JPanel();
        
        mainLayout.setBorder(new EmptyBorder(10,10,10,10));
        mainLayout.setLayout(new GridLayout(2,1));        
        this.setContentPane(mainLayout);
        
        this.initLayoutParametrageFourmiliere();
        this.initLayoutParametragePheromones();
        this.initLayoutParametrageCarte();
        this.initLayoutActions();
    }
    
    
    /**
     * Initialise le layout des boutons
     */
    protected void initLayoutActions()
    {
        JPanel actions = new JPanel();
        
        int nbCols = 0, nbRows = 2;
        
        actions.setLayout(new GridLayout(nbRows,nbCols));
        
        for(int i = 0; i <= nbRows * nbCols; i++)
        {
            actions.add(new JPanel());
        }
        
        //On ajoute le bouton en bas à droite
        actions.add(this.btn_suivant);   
        
        //On ajoute le panneau en [3;0]
        this.add(actions);
    }

    /**
     * Retourne un panel contenant tous les boutons
     * @return le panel en question
     */
    protected JPanel initLayoutButtonsCarte()
    {
        JPanel buttons = new JPanel(new GridLayout(1, 8));

        buttons.add(this.btn_ouvrir);// [1;0]        
        buttons.add(new JPanel());// [1;0]
        buttons.add(this.btn_nouveau);// [1;0]        
        buttons.add(new JPanel());// [1;0]
        
        buttons.add(new JPanel());// [1;0]
        buttons.add(new JPanel());// [1;0]
        buttons.add(this.btn_editer);// [1;0]
        buttons.add(this.btn_supprimer);// [1;0]
        
        return buttons;
    }
    
    protected void initLayoutParametrageCarte()
    {
        JPanel parametres_carte = this.getFieldset("Carte");
        parametres_carte.setLayout(new BorderLayout());
        
        JPanel nord             = this.getCleValeur("Charger une carte existante", this.ld_cartes);
        JPanel centre           = new JPanel(new GridLayout(4,1));
        JPanel centre_centre    = this.initLayoutButtonsCarte();
        
        centre.add(centre_centre);        
        centre.add(new JPanel());        
        centre.add(new JPanel());        
        parametres_carte.add(nord, BorderLayout.NORTH);
        parametres_carte.add(centre, BorderLayout.CENTER);
        
        //On ajoute le panneau en [2;0]
        this.add(parametres_carte);
    }
    
    protected void initLayoutParametragePheromones()
    {
        JPanel parametres_pheromones = this.getFieldset("Phéromones");
        parametres_pheromones.setLayout(new GridLayout(3,1));
        
        JPanel concentration        = this.getCleValeur("Concentration", this.input_concentration);
        JPanel vitesse_evaporation  = this.getCleValeur("Vitesse d'évaporation", this.input_vitesse_concentration);
        
        parametres_pheromones.add(concentration);
        parametres_pheromones.add(vitesse_evaporation);
        //On ajoute le panneau en [1;0]
        this.add(parametres_pheromones);
    }
    
    
    protected void initLayoutParametrageFourmiliere()
    {
        JPanel parametres_fourmilieres = this.getFieldset("Fourmilière");
        parametres_fourmilieres.setLayout(new GridLayout(3,1));
              
        JPanel duree_vie_fourmis = this.getCleValeur("Durée de vie des fourmis", this.input_duree_vie_fourmis);
        JPanel quantite_naissance = this.getCleValeur("Quantité de naissance", this.input_quantite_naissance); 
        
        parametres_fourmilieres.add(duree_vie_fourmis);
        
        JPanel type_naissance_et_frequence = new JPanel(new GridLayout(1,3));
        
        type_naissance_et_frequence.add(this.input_frequence_naissance);
        type_naissance_et_frequence.add(new JLabel("par", JLabel.CENTER));
        type_naissance_et_frequence.add(this.type_frequence_naissance);
        
        JPanel frequence_naissance = this.getCleValeur("Fréquence des nouvelles naissances", type_naissance_et_frequence); 
        
        
        parametres_fourmilieres.add(frequence_naissance);
        parametres_fourmilieres.add(quantite_naissance);
        
        //On ajoute le panneau en [0;0]
        this.add(parametres_fourmilieres);
    }    
    
    protected void deleteCarte(int index)
    {
        
    }
    
    public void selectCarte(Carte c)
    {
        int index = this.cartes.indexOf(c);
        
        if(index >= 0)
        {
            this.ld_cartes.setSelectedIndex(index + 1);
            this.majStateComponents();
        }
    }
    
    public void updateListeCarte()
    {
        this.ld_cartes.removeAllItems();
        this.initDataCartes();
    }
    
    @Override
    public void windowClosing(WindowEvent e) {
        this.confirmBeforeExit();
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == this.btn_nouveau) // Nouvelle carte
        {
            this.ccc.newCarte();
        }else if(e.getSource() == this.ld_cartes) // Chargement d'une carte depuis la liste déroulante
        {
            this.majStateComponents();
        }else if(e.getSource() == this.btn_suivant) // Affichage d'une carte
        {            
            Carte carte = this.getCurrentCarte();
            if(carte != null)
            {                
            	Environnement environnement = carte.getEnvironnement();
            	environnement.setDureeVieFourmis(this.input_duree_vie_fourmis.getValue());
            	environnement.setFrequenceNaissance(this.input_frequence_naissance.getValue());
            	environnement.setQuantiteNaissance(this.input_quantite_naissance.getValue());
            	//environnement.setTypeFrequenceNaissance(this.input_frequence_naissance.getValue());
            	environnement.setConcentration(this.input_concentration.getValue());
            	environnement.setEvaporation(this.input_vitesse_concentration.getValue());            	            	
            	
                this.cs = new ControllerSimulation(this, carte);
                this.dispose();
            }            
        }else if(e.getSource() == this.btn_ouvrir) // Téléchargement d'une carte
        {
            this.ccc.openCarte();
        }else if(e.getSource() == this.btn_supprimer) //Suppression d'une carte
        {
            Carte carte = this.getCurrentCarte();
            if(carte != null)
            {
                int retour = JOptionPane.showConfirmDialog(this, "Êtes-vous sûr de vouloir supprimer cette carte ?", null, JOptionPane.YES_NO_OPTION);
                if(retour == JOptionPane.YES_OPTION && this.ccc.deleteCarte(carte))
                {
                    this.updateListeCarte();
                }
            }            
        }else if(e.getSource() == this.btn_editer) // Modification d'une carte
        {
            Carte carte = this.getCurrentCarte();
            if(carte != null)
            {
                this.ccc.editCarte(carte);
            }            
        }
    }
    
    
    
    //Listeners garbages
    
    @Override
    public void windowOpened(WindowEvent e) {}    

    @Override
    public void windowClosed(WindowEvent e) {}

    @Override
    public void windowIconified(WindowEvent e) {}

    @Override
    public void windowDeiconified(WindowEvent e) {}

    @Override
    public void windowActivated(WindowEvent e) {}

    @Override
    public void windowDeactivated(WindowEvent e) {}

}
